1. Прямая и обратная адресация.
* Ответ (Лекция 2): Способы доступа к элементам последовательности (списка, строки).
* Прямая: Индексы идут от начала, начиная с 0 (0, 1, 2...).
* Обратная: Индексы идут с конца, начиная с -1 (-1 — последний элемент, -2 — предпоследний и т.д.).
* Пример:
s = "abcde"
print(s[0]) # 'a' (прямая)
print(s[-1]) # 'e' (обратная)
2. Срезы списков.
* Ответ (Лекция 2): Механизм извлечения подпоследовательности.
* Синтаксис: [start:stop:step] (начало, конец, шаг).
* Возможности:
* Копирование части списка.
* Переворот списка/строки ([::-1]).
* Выбор элементов через один ([::2]).
* Пример: s[1:-1] — обрезает первый и последний символы.
3. Преобразование списка во множество.
* Ответ (Лекция 2): Используется конструктор set().
* Зачем нужно:
1. Быстрое удаление дубликатов (остаются только уникальные элементы).
2. Подготовка к операциям теории множеств (пересечение, объединение).
* Пример:
L = [1, 2, 2, 3]
unique = set(L) # {1, 2, 3}
4. Что такое словарь? Основные функции работы со словарем.
* Ответ (Лекция 2, 3): Неупорядоченная коллекция пар ключ: значение. Ключи должны быть уникальными и неизменяемыми (хэшируемыми).
* Основные операции:
* D[key] — получение значения (или ошибка, если ключа нет).
* D[key] = value — добавление/изменение.
* key in D — проверка наличия ключа.
* D.keys(), D.values() — получение списков ключей и значений.
* Применение в лекциях: Подсчет частоты букв (палиндром), кеширование (числа Фибоначчи).
5. Однострочник для словаря (Dict Comprehension).
* Ответ (Лекция 2): Способ создания словаря в одну строку.
* Синтаксис: {ключ: значение for элемент in коллекция}.
* Пример (из задачи про палиндром):
# Создаем словарь, где ключ - буква, значение - сколько раз она встречается
D = {b: s.count(b) for b in set(s)}
6. Однострочник для вложенных циклов (списочное включение).
* Ответ (Лекция 5): Используется для обработки многомерных структур (матриц) или создания декартовых произведений.
* Синтаксис: [выражение for i in ... for j in ...].
* Нюанс: Часто используется внутри функций агрегации, таких как sum() или all().
* Пример (проверка матрицы на нули):
# Проверяем все элементы матрицы M[i][j]
all(M[i][j] == 0 for i in range(rows) for j in range(cols))
7. Counter из библиотеки collections.
* Ответ (Лекция 2): Специализированный словарь, предназначенный для подсчета количества неизменяемых объектов.
* Как работает: Принимает на вход итерируемый объект (строку, список) и возвращает словарь, где ключи — элементы, а значения — их количество.
* Пример:
from collections import Counter
Counter("aabbc") # вернет {'a': 2, 'b': 2, 'c': 1}
8. Многомерный массив numpy.
* Ответ (Лекции 2, 5): Объект array из библиотеки numpy.
* Отличие от списка списков:
1. Поддерживает многомерные срезы (например, M[:, 1] — взять второй столбец целиком, что невозможно в обычных списках Python M[:][1]).
2. Работает быстрее и занимает меньше памяти.
3. Позволяет выполнять векторные операции (сложение массивов, умножение на число и т.д. без циклов).
import numpy as np
# Создаем матрицу numpy из списка списков
M_list = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
M = np.array(M_list)
# 1. Доступ к элементу (строка, столбец)
print(M[1, 2])
# Вывод: 6 (строка с индексом 1, столбец с индексом 2)
# В обычном Python это было бы M[1][2]
# 2. Доступ к столбцу (Срез по всем строкам, конкретный столбец)
# Синтаксис: [строки, столбцы]
print(M[:, 1])
# Вывод: [2 5 8]
# : означает "все элементы по этому измерению"
# 3. Вырезка подматрицы (Слайсинг)
# Берем строки с 0 по 1 (не вкл. 2) и столбцы с 1 до конца
sub_matrix = M[0:2, 1:]
print(sub_matrix)
# Вывод:
# [[2 3]
# [5 6]]
# 4. Векторные операции (Бонус!)
# Умножим все элементы матрицы на 2. Без циклов!
print(M * 2)
# Вывод:
# [[ 2 4 6]
# [ 8 10 12]
# [14 16 18]]
# 5. Фильтрация (Маскирование)
# Выберем все элементы больше 5
print(M[M > 5])
# Вывод: [6 7 8 9]